/**
 * 类型的重要意义之一是：限制了数据的可用操作与实际意义。
 * 这往往是通过 类型 附带的额外信息来实现的（类似于元数据），
 * 要在 TypeScript 中实现，需要为类型额外附加元数据，
 * 比如 CNY 与 USD，分别附加上它们的单位信息，但同时又需要保留原本的信息（即原本的 number 类型）
*/
//1、可以通过 交叉类型 的方式来实现信息的附加

//使用 TagProtector 声明了一个具有 protected 属性的类，使用它来携带额外的信息
export declare class TagProtector<T extends string> {
    protected __tag__: T;
}
//和原本的类型合并到一起，得到 Nominal 工具类型
export type Nominal<T, U extends string> = T & TagProtector<U>;
//来改进下 13_类型系统_2、标称类型系统 中的例子：
export type CNY = Nominal<number, 'CNY'>;
export type USD = Nominal<number, 'USD'>;
const CNYCount = 100 as CNY;
const USDCount = 100 as USD;
function addCNY(source: CNY, input: CNY) {
    return (source + input) as CNY;
}
addCNY(CNYCount, CNYCount);
// 报错了！
addCNY(CNYCount, USDCount);

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }